#include "../glob.h"
#include "class.h"
#include <errno.h>

static unsigned int get_keyvalue(char *pszInfo,char *pszKey,char *pszValue);
static unsigned int set_keyvalue(char *pszInfo,unsigned int ulBuffLen,char *pszKey,char *pszValue);
static unsigned int get_keyvaluewithfile(char *pszFile,char *pszKey,char * pszValue);
static unsigned int set_keyvaluewithfile(char *pszFile,char *pszKey,char * pszValue);


unsigned int get_filesize(char *pszFile)
{
    unsigned int ulLen = 0;
    FILE *fp;

    if(NULL == pszFile)
        return ulLen;

    fp = fopen(pszFile,"r");
    if (NULL == fp)
        return ulLen;

    fseek(fp,0,SEEK_END);
    ulLen = ftell(fp);

    fclose(fp);

    return ulLen;
}

static unsigned int get_keyvalue(char *pszInfo,char *pszKey,char *pszValue)
{
	char     *pszPo = NULL;
	char     *pszPt = NULL;
	char     szKey[32] = {0};
	unsigned int   ulLen = 0;
	unsigned int	ulSpace = 0;
	

	if ((NULL == pszInfo) ||(NULL == pszKey) ||(NULL == pszValue))    
    {
        return 1;
    }

	snprintf(szKey,sizeof(szKey),"%s=",pszKey);
	pszPo = strstr(pszInfo,szKey);
    if (NULL == pszPo)
    {
        
		snprintf(szKey,sizeof(szKey),"%s =",pszKey);
		pszPo = strstr(pszInfo,szKey);
		ulSpace = 1;
		if (NULL == pszPo)
			return 1;
    }
	
	pszPt = strstr(pszPo,"\n");
    if (NULL == pszPt)
    {
        return 1;
    }

	pszPo = pszPo+1+strlen(pszKey)+ulSpace*2;
	ulLen = pszPt-pszPo;
	memcpy(pszValue,pszPo,ulLen);

	return 0;
}

static unsigned int set_keyvalue(char *pszInfo,unsigned int ulBuffLen,char *pszKey,char *pszValue)
{
    char     *pszPo = NULL;
    char     *pszPt = NULL;
    char     *pszPr = NULL;
    char     szKey[32] = {0};
    unsigned int   ulLen = 0;
    unsigned int   ulLeno = 0;
	unsigned int	ulSpace = 0;

    if ((NULL == pszInfo) ||(NULL == pszKey) ||(NULL == pszValue) || (0==ulBuffLen))    
    {
        return 1;
    }

    snprintf(szKey,sizeof(szKey),"%s=",pszKey);
    
    pszPo = strstr(pszInfo,szKey);
    if (NULL == pszPo)
    {
        ulSpace = 1;
		snprintf(szKey,sizeof(szKey),"%s =",pszKey);
		pszPo = strstr(pszInfo,szKey);
		if (NULL == pszPo)
			return 1;
    }
		
    pszPt = strstr(pszPo,"\n");
    if (NULL == pszPt)
    {
        return 1;
    }
    
    pszPo = pszPo+1+strlen(pszKey)+ulSpace*2;
    ulLen = pszPo-pszInfo;
	ulLeno = ulBuffLen-ulLen-strlen(pszValue);
    
    pszPr = (char*)malloc(ulLeno+1);
    if (NULL == pszPr)
    {
        return 1;
    }
    memset(pszPr,0,ulLeno+1);
    memcpy(pszPr,pszPt,ulLeno);
    memset(pszPo,0,(ulBuffLen-ulLen));
    memcpy(pszPo,pszValue,strlen(pszValue));
    memcpy(pszPo+strlen(pszValue),pszPr,ulLeno);
    free(pszPr);
    return 0;
}


/*****************************************************************
** 函数名       	:get_keyvaluewithfile
** 输 入            :pszFile 文件名
					 pszKey	 key
					 pszValue value
** 输 出            : pszValue value
** 功能描述 		:将文件pszFile中的key值取出
** 全局变量 		:
** 调用模块 		:
** 作 者            :陈碧
** 日 期            :2012-12-06
** 修 改            :
** 日 期            :
** 版本
****************************************************************/
static unsigned int get_keyvaluewithfile(char *pszFile,char *pszKey,char * pszValue)
{
	FILE *fp;
	char		*pszCnt;
	unsigned int	ulFileLen;

	if ((NULL == pszFile) ||(NULL == pszKey) ||(NULL == pszValue))    
    {
        printf("parameter is invalid.\n");
        return 1;
    }
	
	ulFileLen = get_filesize(pszFile);
	pszCnt = (char*)malloc(ulFileLen);
	if (NULL == pszCnt)
	{
		return 	1;	
	}
	
	memset(pszCnt,0,ulFileLen);

	fp = fopen(pszFile,"r");
	if (NULL == fp)
	{
        printf("%s\n",strerror(errno));
        free(pszCnt);
		return 1;	
	}

	fread(pszCnt,sizeof(char),ulFileLen,fp);
	fclose(fp);
	fp = NULL;

	get_keyvalue(pszCnt,pszKey,pszValue);

	free(pszCnt);

	return 0;
}


/*****************************************************************
** 函数名       	:set_keyvaluewithfile
** 输 入            :pszFile 文件名
					 pszKey	 key
					 pszValue value
** 输 出            : 
** 功能描述 		:将文件pszFile中的key pszKey 设置成value pszValue,
						pszValue不能大于64
** 全局变量 		:
** 调用模块 		:
** 作 者            :陈碧
** 日 期            :2012-12-06
** 修 改            :
** 日 期            :
** 版本
****************************************************************/
static unsigned int set_keyvaluewithfile(char *pszFile,char *pszKey,char * pszValue)
{
	char		*pszCnt;
	unsigned int	ulFileLen;
	unsigned int	ulLen;
	FILE *fp;

	if ((NULL == pszFile) ||(NULL == pszKey) ||(NULL == pszValue))    
    {
        return 1;
    }

	if(strlen(pszValue)>64)
	{
		return 1;
	}

	ulFileLen = get_filesize(pszFile);
	ulLen = ulFileLen+64;
	pszCnt = (char*)malloc(ulLen);
	if (NULL == pszCnt)
	{
		return 	1;	
	}
	memset(pszCnt,0,ulLen);
	
	fp = fopen(pszFile,"r");
	if (NULL == fp)
	{
		free(pszCnt);
		return 1;	
	}

	fread(pszCnt,sizeof(char),ulLen,fp);
	fclose(fp);
	fp = NULL;
	
	
	set_keyvalue(pszCnt,ulLen,pszKey,pszValue);
	fp = fopen(pszFile,"wb+");
    if (NULL == fp)
    {
    	free(pszCnt);
		return 1;
    }
    fputs(pszCnt,fp);
    fclose(fp);

	free(pszCnt);
	return 0;
}

int fun_aggre_init(fun_aggre_t *fun_aggre)
{
	if (fun_aggre)
	{
		fun_aggre->get_key = get_keyvaluewithfile;
		fun_aggre->set_key = set_keyvaluewithfile;
		fun_aggre->get_filesize = get_filesize;
	}
	
	return 0;
}

int main(int argc, char* argv[])
{
	char key[32]="name";
	char value[32]={0};
	
	fun_aggre_t *fun_aggre = NULL;
	fun_aggre = malloc(sizeof(fun_aggre_t));
	memset(fun_aggre,0,sizeof(fun_aggre_t));
	fun_aggre_init(fun_aggre);
	
	fun_aggre->get_key("key.txt",key,value);
	printf("value=%s\n",value);
	
	free(fun_aggre);

	return 0;
}